package part15;

/**
 * @author wcj
 * @Date 2021/5/30 17:56
 * @Version 1.0
 */
public class Part1534 {

    public static void main(String[] args) {
        A a = new A();
        a.set(a);
        a = a.set(new A()).getItem();
        a = a.getItem();
        C c = new C();
        c = c.setAndGet(c);
    }
}

/**
 * 自限定和循环泛型差不多，也是用于继承关系，基类拥有导出类的类型作为参数，成为一个功能模板
 * 因此自限定就类似于接口这种东西一样，只不过采取的方式不是实现，而是通过继承，让基类的类型参数随着子类变化，从而执行方法返回不同的子类的具体对象
 *
 * @param <T>
 */
class SelfBound<T extends SelfBound<T>> {
    T item;

    SelfBound<T> set(T item) {
        this.item = item;
        return this;
    }

    T getItem() {
        return item;
    }
}

class A extends SelfBound<A> {
}

class B extends SelfBound<B> {
}

class C extends SelfBound<C> {
    C setAndGet(C arg) {
        set(arg);
        return getItem();
    }
}

class D {
}

class F extends SelfBound {
}

